package c05面向对象;

/**
 * @author 炜sama
 * 要使 a instanceof B 能通过编译，就要满足以下条件：
 * a、a只能是引用类型变量或null！
 * <p>
 * B1、B可以是类或接口。
 * B2、a和B类型相同。
 * B3、a和B具有继承关系——谁继承谁都行，如a的类型是B的子类，或父类（必定返回false）！
 * <p>
 * 另外，@@a和B应该对应于：b=(B)a;（b是B类型的对象）！！！
 */
public class 使用instanceof的注意事项 {
	public static void main(String[] args) {
		int i = 0;
//		System.err.println(i instanceof Integer);//@@编译错误！a只能是引用类型变量！
		System.err.println(null instanceof Integer);//a也可以是null，null不是任何类或接口的实例！返回false
//		System.err.println(Object instanceof Object);//编译错误！

		Object o = new Object();
		System.err.println(o instanceof Object);//很明显可以通过编译！o和Object同类型！返回true
		System.err.println(o instanceof String);//@@可以通过编译！因为String是o类型的子类。返回false
		System.err.println(o instanceof Comparable);//@@可以通过编译！因为任何接口或都隐藏实现了Object类。返回false
		String s = "";
		System.err.println(s instanceof Object);//@@可以通过编译！因为Object是s类型的父类！返回true

		//如果a具有多态性，请看：
		//声明hello时使用Object类，则hello的编译类型是Object，
		//Object是所有类的父类 , 但hello变量的实际类型是String
		Object hello = "Hello";
		//String是Object类的子类，可以进行instanceof运算。返回true。
		System.err.println("字符串是否是Object类的实例："
				+ (hello instanceof Object));
		//返回true。
		System.err.println("字符串是否是String类的实例："
				+ (hello instanceof String));
		//@@Math是Object类的子类，可以进行instanceof运算。返回false。
		System.err.println("字符串是否是Math类的实例："
				+ (hello instanceof Math));
		//String实现了Comparable接口，所以返回true。
		System.err.println("字符串是否是Comparable接口的实例："
				+ (hello instanceof Comparable));
		String a = "Hello";
		//String类既不是Math类，也不是Math类的父类，
		//所以下面代码编译无法通过
//		System.err.println("字符串是否是Math类的实例："
//			+ (a instanceof Math));
	}
}
